#ifndef __UtilsLexertools__h__
#define __UtilsLexertools__h__

#include "neiderra/core/Base.h"
#include "neiderra/core/io/IOStream.h"

#include <string>

using namespace neiderra::core;
// using namespace neiderra::core::io;

namespace neiderra { 
	namespace utils { 
		namespace lexer {
	
			enum tokens
			{
				tokID,			//		0
				tokNUM_INTEGER,//		1
				tokNUM_FLOAT,	//		2
				tokCHAR,		//		3
				tokDOT,		//		4
				tokCOMMA,		// ,	5
				tokICOMMA,		// "	6
				tokEOS,		// ;	7
				tokDOT_DOT,	// :	8
				tokLABRACKET,	// <	9
				tokRABRACKET,	// >	10
				tokLFBRACKET,	// {	11
				tokRFBRACKET,	// }	12
				tokLBRACKET,	// (	13
				tokRBRACKET,	// )	14
				tokQUEST,		// ?	15
				tokASSIGN,		// =	16
				tokERRTOK,		//		17
				tokSLASH,		// '/'	18
				tokBACKSLASH,	// '\'	19
				tokSTRING,		//		20
				tokSPECIAL,	//		21
				tokEOFTOK,		//		22
				tokBOFTOK,		//		23
				tokSLARB,		//	</	24
				tokCOMMENT,	//	25
				tokSTAR,		//	26
				tokPLUS, 		//	27
				tokMINUS,		//	28
				tokBOBOS,		// $
				tokNONE
			};
		
			enum comment_styles {
				csCPP,
				csPascal,
				csXML,
				csDefault,
				csASM,
				csSHELL
			};
			
			union tokenval
			{
				char sval[256];
				int num_int;
				float num_float;
				char ch;
				char* p;
				//...
			};
		
			struct Token{
				Token(){id = tokBOFTOK;}
				tokens id;
				tokenval value;
			};
		
			//! Scanner
			class Lexer: public Base
			{
			public:
				Lexer(Core* core);
				Lexer(Core* core, iInputStream* input);
				virtual ~Lexer();
		
				virtual void setInputStream(iInputStream* input);
				virtual void skipComments(comment_styles);
				virtual void skipEOS(bool f) {_skipEOS = f;}
		
				virtual Token nextToken();
				virtual void back();
				virtual Token copyUntil(char ch);
				virtual int getLine();
		
				virtual void reset() {pos = oldpos = 0; cline_ = 0; } 
			protected:
				iInputStream* input_;
				char* buf_;
				unsigned pos, oldpos;
				comment_styles cs_;	// defualt NO
				int cline_;
				bool _skipEOS;
			};

		}
	}
}

#endif
